package com.lwj.se;

/**
 *  * ���߳�:���̸߳ı��˴����ִ�з�ʽ����ԭ�е����д��붼���в����ı�Ϊ�������Ƭ��֮�䲢�в�������˶��߳�����������Ƭ��"ͬʱ����"��
 */
public class ThreadDemo {
    /**
     * �����߳�
     */
      public void test(){
          //������ʽ1
          MyThread1 myThread1 = new MyThread1();
          myThread1.start();
          //������ʽ2
          MyRunnable1 myRunnable1 = new MyRunnable1();
          Thread thread = new Thread(myRunnable1);
          thread.start();
          //������ʽ3
          Thread t1 = new Thread() {
              public void run() {
                  for(int i=0;i<1000;i++) {
                      System.out.println("����˭��?");
                  }
              }
          };

          //������ʽ4
          Runnable r2 = new Runnable() {
              public void run() {
                  for(int i=0;i<1000;i++) {
                      System.out.println("���ǲ�ˮ���!");
                  }
              }
          };
          Thread t2 = new Thread(r2);

          t1.start();
          t2.start();
      }

    /**
     * �̷߳���
     */
    public void test1() throws InterruptedException {
        //��ȡ�������������test1�����߳�
        Thread main = Thread.currentThread();
        //��ȡ�̵߳�����
        String name = main.getName();
        //��ȡΨһ��ʶ
        long id = main.getId();
        //��ȡ�̵߳����ȼ�
        int priority = main.getPriority();
        //�жϵ�ǰ���߳��Ƿ��ڻ״̬
        boolean isAlive =  main.isAlive();
        //�Ƿ�ʱ�ػ��߳�
        boolean isDaemon = main.isDaemon();
        //�жϵ�ǰ�߳��Ƿ��ж�
        boolean inInterrupted = main.isInterrupted();

        MyThread1 myThread1 = new MyThread1();
        //�������ȼ����߳�����������뵽���̵߳�����ͳһ�����������߳�����֮ǰ�������ȼ������̶ȵĸ������CPUʱ��Ƭ�ļ��ʣ��̵߳����ȼ���10���ȼ������ȼ�Խ�ߵ��̻߳�ȡCPUʱ��Ƭ�ļ���Խ��
        myThread1.setPriority(Thread.MIN_PRIORITY);
        //�����߳�Ϊ�ػ��̣߳����̵Ľ���:��������ͨ�̶߳�����ʱ�����̽����������̽���ʱ�������������е��ػ��̶߳��ᱻǿ��ֹͣ��
        myThread1.isDaemon();
        myThread1.start();
        //����״̬,��λ����
        Thread.sleep(5000);

    }

    /**
     * sleep����Ҫ�����ж��쳣
     * ��һ���̵߳���sleep������������״̬�Ĺ���
     * �У���ʱ�������̵߳����˸��̵߳�interrupt
     * ��������ô�ͻ�������̵߳�˯����������ʱ
     * sleep�����ͻ��׳��ж��쳣��֪��
     */
    public  void test3() {
        final Thread lin = new Thread() {
            public void run() {
                System.out.println("��:�������ݣ�˯һ��...");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    System.out.println("��:������!������!������!����������!");
                }
                System.out.println("��:����!");
            }
        };

        Thread huang = new Thread() {
            public void run() {
                System.out.println("��:��ʼ��ǽ!");
                for(int i=0;i<5;i++) {
                    System.out.println("��:80!");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                }
                System.out.println("�۵�!");
                System.out.println("��:�㶨!");
                //�ж�lin������״̬
                lin.interrupt();
            }
        };


        lin.start();
        huang.start();
    }

    /**
     * ���̲߳����İ�ȫ����
     * ������̲߳�������ͬһ�ٽ���Դ�������߳��л�ʱ����ȷ�������¶���̲߳�������Դδ���ճ�����Ƶ�˳����У����³��ִ�������ʱ���ܳ���ϵͳ̱���������
     *
     * �ٽ���Դ:ͬһʱ��ֻ�ܱ�һ���̲߳�������Դ
     */
   public void test4(){
       final Table table = new Table();

       Thread t1 = new Thread() {
           public void run() {
               while(true) {
                   int bean = table.getBean();
                   Thread.yield();//ģ��CPUû��ʱ����
                   System.out.println(getName()+":"+bean);
               }
           }
       };
       Thread t2 = new Thread() {
           public void run() {
               while(true) {
                   int bean = table.getBean();
                   Thread.yield();//ģ��CPUû��ʱ����
                   System.out.println(getName()+":"+bean);
               }
           }
       };
       t1.start();
       t2.start();
   }

    /**
     * ������
     * ��ʹ��synchronized�����������Ƭ�Σ�����ָ����ͬ��������������ͬһ��ʱ����Щ����Ƭ�μ���ǻ���ģ�����̲߳���ͬʱ����Щ����Ƭ�μ�һ��ִ�С�
     */
   public void test5(){
       final Foo foo = new Foo();
       Thread t1 = new Thread() {
           public void run() {
               foo.methodA();
           }
       };
       Thread t2 = new Thread() {
           public void run() {
               foo.methodB();
           }
       };
       //foo����methodA,methodB�����첽ִ�У�ֻ��ִ����һ�����������ִ����һ������
       t1.start();
       t2.start();
   }

    public static void main(String[] args) {
        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.test5();
    }
    class MyThread1 extends Thread{
        public void run() {
            for(int i=0;i<1000;i++) {
                System.out.println("���ɶ?");
            }
        }
    }
    class MyRunnable1 implements Runnable{
        public void run() {
            for(int i=0;i<1000;i++) {
                System.out.println("����զ��!");
            }
        }
    }

    class Table{
        //��������20������
        private int beans = 20;
        /**
         * ��һ������ʹ�ùؼ���synchronized���κ�
         * ���������Ϊ"ͬ������"������̲߳���ͬʱ
         * �ڷ����ڲ�ִ�С�
         * ������߳��첽�����ٽ���Դ��Ϊͬ������
         * �Ϳ��Խ�����̵߳Ĳ�����ȫ�����ˡ�
         *
         * 1.�ڷ�����ֱ��ʹ��synchronized,��ôͬ��������������ǵ�ǰ������������this
           2.synchronized��this��{} ��ͬ���飬��Сͬ����Χ���ڱ�֤������ȫ��ǰ���¾����ܵ���߲�����Ч��
         */
        public synchronized int getBean() {
            if(beans==0) {
                throw new RuntimeException("û�ж�����!");
            }
            /*
             * static void yield()
             * ��һ���߳�ִ�е��������ʱ�������ó�
             * ����CPUʱ��Ƭ���ص�RUNNABLE״̬��
             */
            Thread.yield();//ģ��CPUû��ʱ����
            return beans--;
        }
    }

    class Foo{
        public synchronized void methodA() {
            Thread t = Thread.currentThread();
            System.out.println(t.getName()+":����ִ��A����...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }
            System.out.println(t.getName()+":ִ��A�������!");
        }
        public synchronized void methodB() {
            Thread t = Thread.currentThread();
            System.out.println(t.getName()+":����ִ��B����...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }
            System.out.println(t.getName()+":ִ��B�������!");
        }
    }

}
